package com.guigu.yh.springcloud.controller;

import com.guigu.yh.springcloud.service.PaymentService;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 顺序控制器
 *
 * @author zyh
 * @version 1.0.0
 * @date 2022/08/23
 */
@Slf4j
@RestController
@DefaultProperties(defaultFallback = "defaultFallback_Handler") //设置全局默认降级处理函数，减少代码量。
public class OrderHystrixController {

    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    /**
     * 正常访问 ok 的方法
     *
     * @param id id
     * @return {@link String }
     * @author 张颖辉（zyh）
     * @date 2022/08/23
     * @version 1.0.0
     */
    @RequestMapping("hystrix/ok/{id}")
    public String PaymentInfo_OK(@PathVariable("id") Integer id) {
        log.info("******* 消费者接口 {},参数id :{}", "正常响应接口", id);
        return paymentService.paymentInfo_OK(id);
    }

    /**
     * 异常的方法：超时
     * 调用远程服务8008的延时响应函数
     *
     * @param id id
     * @return {@link String }
     * @author 张颖辉（zyh）
     * @date 2022/08/23
     * @version 1.0.0
     */
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeOut_Handler",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") //1.5秒就不再等结果了，直接调用降级兜底函数
            })
    @RequestMapping("hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
        log.info("******* 消费者接口 {},参数id :{}", "超时响应接口", id);
        return paymentService.paymentInfo_TimeOut(id);
    }

    /**
     * 服务消费者 降级 兜底方法
     */
    public String paymentInfo_TimeOut_Handler(Integer id) {
        return "线程池：" + Thread.currentThread().getName() + " 系统繁忙，请稍后再试，服务生产者|降级|兜底方法，serverPort:" + serverPort;
        //http://localhost/consumer/hystrix/timeout/13
        //线程池：hystrix-OrderHystrixController-2 系统繁忙，请稍后再试，服务生产者|降级|兜底方法，serverPort:80
    }

    /**
     * 异常的方法：报错
     * 调用远程服务8008的报错响应函数
     *
     * @param id id
     * @return {@link String }
     * @author 张颖辉（zyh）
     * @date 2022/08/22
     * @version 1.0.0
     */
    @RequestMapping("hystrix/err/{id}")
    //@HystrixCommand(fallbackMethod = "paymentInfo_Err_Handler") //注释掉这个注解就会使用默认配置 @DefaultProperties注解配置的降级函数
    public String paymentInfo_Err(@PathVariable("id") Integer id) {
        log.info("******* 消费者接口 {},参数id :{}", "异常接口", id);
        return paymentService.paymentInfo_Err(id);
    }

    /**
     * 服务消费者 降级 兜底方法
     */
    public String paymentInfo_Err_Handler(Integer id) {
        return "线程池：" + Thread.currentThread().getName() + " 系统错误，请稍后再试，服务生产者|降级|兜底方法，serverPort:" + serverPort;
        //http://localhost/consumer/hystrix/err/13
        //线程池：hystrix-OrderHystrixController-1 系统错误，请稍后再试，服务生产者|降级|兜底方法，serverPort:80
    }

    /**
     * 服务消费者
     * 全局 降级 兜底方法
     */
    public String defaultFallback_Handler(Integer id) {
        return "线程池：" + Thread.currentThread().getName() + " 系统繁忙或错误，服务生产者|降级|默认兜底方法，serverPort:" + serverPort;
    }

}
